package cn.lccabc.dichotomy.no0081;

/**
 * @program: leet-code
 * @description: 假设按照升序排序的数组在预先未知的某个点上进行了旋转。
 *
 * ( 例如，数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] )。
 *
 * 编写一个函数来判断给定的目标值是否存在于数组中。若存在返回 true，否则返回 false。
 *
 * 示例 1:
 *
 * 输入: nums = [2,5,6,0,0,1,2], target = 0
 * 输出: true
 * 示例 2:
 *
 * 输入: nums = [2,5,6,0,0,1,2], target = 3
 * 输出: false
 * 进阶:
 *
 * 这是 搜索旋转排序数组 的延伸题目，本题中的 nums  可能包含重复元素。
 * 这会影响到程序的时间复杂度吗？会有怎样的影响，为什么？
 *
 * @author: LiCC
 * @create: 2020-02-25 15:58
 */
public class Solution {

    public static boolean search(int[] nums, int target) {
        if (nums.length == 0) return false;
        int left = 0, rigth = nums.length - 1, mid;
        while (left <= rigth){
            mid = left + (rigth - left) / 2;
            if (nums[mid] == target) return true;
            if (nums[left] == nums[mid]) {
                left++;
                continue;
            }
            //前半部分有序
            if (nums[mid] > nums[left]){
                //target在前半部分
                if (nums[mid] > target && nums[left] <= target){
                    rigth = mid - 1;
                } else {
                    //否则，去后半部分找
                    left = mid + 1;
                }
            } else {
                //后半部分有序
                //target在后半部分
                if (nums[mid] < target && nums[rigth] >= target){
                    left = mid + 1;
                } else {
                    //否则，去后半部分找
                    rigth = mid - 1;
                }
            }
        }
        return false;

    }

    public static void main(String[] args) {
        int[] nums = new int[]{2,5,6,0,0,1,2};
        int target = 3;
        boolean result = search(nums, target);
        System.out.println(result);
    }
}
